var myInfowindow = null;  

 function BizMap(mapid,
                 islargemap,
                 isoverview,
                 isscale,
                 ismaptype,
                 issearch,
                 slat,
                 slng,
                 slevel,
                 iconimage,
                 iconwidth,
                 iconheight,
                 officeLayer, 
                 layers,
                 iconData,
                 slider,
                 q,
                 moduleid,
                 pgtemplate,
                 pagesize,
                 defmaptype,
                 listpageid,
                 isStreetView,
                 StreetViewPaneID,
                 DirStartID,
                 DirEndID,
                 DirButtonID,
                 DirPanelID,
                 showSideBar,
                 showDirection,
                 defMarkerLat,
                 defMarkerLng
                 )
   {
    var mymap;
     var mgr;
    this.icons = {};
    this.lsc=null;
    
    this.mapid=mapid;
    this.largemap=islargemap;
    this.overview=isoverview;
    this.scale= isscale;
    this.maptype=ismaptype;
    this.search=issearch;
    this.startlat=slat;
    this.startlng=slng;
    this.startlevel=slevel;
    this.iconimage=iconimage;
    this.iconwidth=iconwidth;
    this.iconheight=iconheight;
    this.officeLayer=officeLayer;
    this.iconData=iconData;
    this.searchquery=q;
    this.sidebarid= slider;
    this.layers=layers;
    this.sbar=null;
    var me=this;
    this.moduleid=moduleid;
    this.pgtemplate=pgtemplate;
    this.pagesize=pagesize;
    this.defmaptype=defmaptype;
    this.listpageid=listpageid;
    this.StreetViewPaneID=StreetViewPaneID;
    var allmarkers=[];
    var currentmarkers=[];
    this.cmarkers=[];
    this.categories=[];
    this.infowindow = new google.maps.InfoWindow({ content: ""  });
    this.selectedMarker = null;
    var bounds = new google.maps.LatLngBounds();
    this.bd=bounds;
    this.loadinglayer = false;
    this.getAllmarkers=function(){return allmarkers;};
     this.addtoAllmarkers=function(mk){allmarkers.push(mk);};
     this.isStreetView = isStreetView;
    this.directionsDisplay=null;
    this.DirStartID=DirStartID;
    this.DirEndID=DirEndID;
    this.DirButtonID=DirButtonID;
    this.DirPanelID=DirPanelID;
    this.directionsService=null;
    this.showSidebar=showSideBar;
    this.showDirection=showDirection;
    this.defMarkerLat=defMarkerLat;
    this.defMarkerLng=defMarkerLng;
    this.defMarker=null;
    this.closeinfo=true;

    this.load = function() {
        if (myInfowindow == null) myInfowindow = new window.google.maps.InfoWindow({ content: "" });

        me.sbar = document.getElementById(me.sidebarid);

        var cp = new window.google.maps.LatLng(this.startlat, this.startlng);
        var myOptions = {
            zoom: this.startlevel,
            center: cp,
            mapTypeId: this.defmaptype,
            navigationControl: this.largemap,
            mapTypeControl: this.maptype,
            scaleControl: this.scale,
            streetViewControl: this.isStreetView
        };

        me.map = new window.google.maps.Map(document.getElementById(mapid), myOptions);


        if (this.isStreetView && me.StreetViewPaneID != null) {
            if (document.getElementById(me.StreetViewPaneID) != null) {
               
                me.setStreetView(cp);

                window.google.maps.event.addListener(me.map, 'dblclick', function(event) {

                    me.setStreetView(event.latLng);
                }
                 );
            }
        } else if (!this.isStreetView && me.StreetViewPaneID != null)
            HideObject(me.StreetViewPaneID);

        mymap = me.map;
        me.loadLayer();

        mgr = new MarkerManager(me.map, { trackMarkers: true });
//        google.maps.event.addListener(mymap, "zoom_changed", me.setZoom);
        window.google.maps.event.addListener(mgr, 'changed', me.zoomEvent);

        window.google.maps.event.addListener(mgr, 'loaded', me.setupOfficeMarkers);

        if (me.showDirection) {
            me.directionsService = new window.google.maps.DirectionsService();

            me.directionsDisplay = new window.google.maps.DirectionsRenderer({
                'map': me.map,
                'preserveViewport': true,
                'draggable': true

            });
            // me.directionsDisplay.setMap(me.map);


            if (me.DirPanelID != null && document.getElementById(me.DirPanelID) != null) {
                me.directionsDisplay.setPanel(document.getElementById(me.DirPanelID));
            }
            if (me.DirButtonID != null && document.getElementById(me.DirButtonID) != null) {
                var bt = document.getElementById(me.DirButtonID);
                bt.onclick = me.calcRoute;
            }
        } else {
            HideObject(me.DirPanelID);
            HideObject(me.DirButtonID);
            HideObject(me.DirStartID);
            HideObject(me.DirEndID);
        }

        if (!me.showSidebar) {
            HideObject(me.sidebarid);
            HideObject(listpageid);
        }
        //  }
    };
     this.setStreetView = function(cp) {
    var panoramaOptions = {
        position: cp,
        pov: {
            heading: 34,
            pitch: 10,
            zoom: 1
        }
    };
         var panorama = new window.google.maps.StreetViewPanorama(document.getElementById(me.StreetViewPaneID), panoramaOptions);
    me.map.setStreetView(panorama);
    };
     this.setZoom = function() {
//        if (me.loadinglayer) {
//            //  alert(1);
//            me.loadinglayer = false;
//            setTimeout(me.setRunZoom, 2000);
//        }
    };
     this.setRunZoom = function() {
//    if (me.defMarker != null) {

//                me.map.setCenter(me.defMarker.getPosition());
//                google.maps.event.trigger(me.defMarker, 'click');
//                var zm = me.map.getZoom();
//                me.closeinfo = false;
//                if (zm < me.defMarker.minzoom) me.map.setZoom(me.defMarker.minzoom);
//                if (zm > me.defMarker.maxzoom) me.map.setZoom(me.defMarker.maxzoom);
//            }
//            else {
//                me.map.setCenter(new google.maps.LatLng(me.startlat, me.startlng));
//                me.map.setZoom(me.startlevel);
//            }

    };
     this.zoomEvent=function (shownBounds,markers){
  
       if (me.closeinfo)
         me.infowindow.close();
       else
         me.closeinfo=true;  
         me.cmarkers.splice(0,me.cmarkers.length);
         var zz=shownBounds.z;
         var bmks=[];
       
         var ll=allmarkers.length;
         for(var i=0;i<ll;i++)
         {
         var mk=allmarkers[i];
           if(mk.minzoom<=zz && mk.maxzoom>=zz)
           {
         
            var chk = document.getElementById('chk' + mk.category);
            if(chk!=null){
             if (chk.checked||mk.category=='')
               {
                 mk.setVisible(true);
                 bmks.push(mk);
               }
               else 
                  mk.setVisible(false);
              }
              else
              {
                 mk.setVisible(true);
                 bmks.push(mk);
              }    
            me.cmarkers.push(mk);
            }
         }
         currentmarkers=bmks;
         
        var sidebar=me.sbar;
     
              
          if (sidebar!=null&&me.showSidebar)
         {
          addtosidebar(sidebar,bmks,moduleid);
          setPage(moduleid,pgtemplate,pagesize,listpageid);
         }
         
         
    };
     this.setupOfficeMarkers = function() {
       
        var geocoder;
         geocoder = null;
         var mp = me;
        var barmarkers = [];

        var l1=officeLayer.length;
        for (var i =0;i<l1;i++) { // for i
            var layer = officeLayer[i];
            var markers = [];
            var l=officeLayer[i]["places"].length;
            for (var j =0;j<l;j++) {//for j
                var place = officeLayer[i]["places"][j];
                var icon = me.getIcon(iconData, place["icon"]);
                var title = place["name"];
                var address = place["address"];
                var desc = place["desc"];

                if (place["posn"][0] != "" && place["posn"][1] != "" && place["posn"][0] != null && place["posn"][1] != null) {
                    var posn = new window.google.maps.LatLng(place["posn"][0], place["posn"][1]);

                    var marker = createMarker(posn, title, desc, icon, me);
                    marker.category = place["icon"];
                    marker.minzoom = layer["zoom"][0];
                    marker.maxzoom = layer["zoom"][1];
                    bounds.extend(posn);
                    markers.push(marker);
                    barmarkers.push(marker);
                    allmarkers.push(marker);

                    if (me.defMarkerLat == place["posn"][0] && me.defMarkerLng == place["posn"][1]) {

                        me.defMarker = marker;
                    }


                }
                else if (address != " ") {//else
                    geocoder = new window.google.maps.Geocoder();
                    if (geocoder) { //0
                        var p = new myMakerPos(layer, place, mp, mgr, me.sbar, moduleid, pgtemplate, pagesize);
                        geocoder.geocode({ 'address': address }, p.findloc);

                    } //0
                } //else

            } //for j


            mgr.addMarkers(markers, layer["zoom"][0], layer["zoom"][1]);
        } // for i
        mgr.refresh();

        if (me.defMarker != null) {

            me.map.setCenter(me.defMarker.getPosition());
            window.google.maps.event.trigger(me.defMarker, 'click');
            var zm = me.map.getZoom();
            me.closeinfo = false;
            if (zm < me.defMarker.minzoom) me.map.setZoom(me.defMarker.minzoom);
            if (zm > me.defMarker.maxzoom) me.map.setZoom(me.defMarker.maxzoom);
        }
        else {
            me.map.setCenter(new window.google.maps.LatLng(me.startlat, me.startlng));
            me.map.setZoom(me.startlevel);
        }
    };
     this.setFrom = function() {
  if (me.DirStartID != null && document.getElementById(me.DirStartID) != null && me.DirEndID != null && document.getElementById(me.DirEndID) != null) {
      document.getElementById(me.DirStartID).value = "[" + me.selectedMarker.getPosition().lat() + "," + me.selectedMarker.getPosition().lng() + "]";
  }
 };
     this.setTo = function() {
     if (me.DirStartID != null && document.getElementById(me.DirStartID) != null && me.DirEndID != null && document.getElementById(me.DirEndID) != null) {
         document.getElementById(me.DirEndID).value = "[" + me.selectedMarker.getPosition().lat() + "," + me.selectedMarker.getPosition().lng() + "]";
     }
 };
     this.setCenter = function(addressid) {
     var address = document.getElementById(addressid).value;
         if (address != null) {
         var geocoder = new window.google.maps.Geocoder();
         if (geocoder) {

             geocoder.geocode({ 'address': address }, function(results, status) {
                 if (status == window.google.maps.GeocoderStatus.OK) {
                     me.map.setCenter(results[0].geometry.location);
                 }
             }
                        );

         }

         return false;
     }
 };
     this.loadLayer = function() {

     var ll=me.layers.length;
     for (var k=0;k<ll;k++) {
         me.loadinglayer = true;
         
       
         var ly = me.layers[k];
         var tp = ly["layertype"];
         var lc = ly["layercode"];
         switch (tp) {
             case 0:
                 var nyLayer = new window.google.maps.KmlLayer(lc);
                 nyLayer.setMap(me.map);
                 break;
             case 1:
                 var trafficLayer = new window.google.maps.TrafficLayer();
                 trafficLayer.setMap(me.map);
                 break;
             case 2:
                 var bikeLayer = new window.google.maps.BicyclingLayer();
                 bikeLayer.setMap(me.map);
                 break;
             case 3:
                 var layer = new window.google.maps.FusionTablesLayer(Number(lc));
                 layer.setMap(me.map);
                 break;
         }
        
     }
 };
     this.FitMapToData = function () {
        me.map.setCenter(new window.google.maps.LatLng(0,0));
        this.map.setZoom(this.map.getBoundsZoomLevel(this.bd));
        this.map.setCenter(this.bd.getCenter());
        };
     this.calcRoute = function() {

            if (me.DirStartID != null && document.getElementById(me.DirStartID) != null && me.DirEndID != null && document.getElementById(me.DirEndID) != null) {
                var start = document.getElementById(me.DirStartID).value;
                var end = document.getElementById(me.DirEndID).value;

                var startloc = GetSearchLocation(start);
                var endloc = GetSearchLocation(end);
                         
                var request = {
                    origin: startloc,
                    destination: endloc,
                    travelMode: window.google.maps.DirectionsTravelMode.DRIVING
                };
                me.directionsService.route(request, function(result, status) {
                    if (status == window.google.maps.DirectionsStatus.OK) {
                        me.directionsDisplay.setDirections(result);
                    }
                });
            }
            return false;
        }; //
    }

    function GetSearchLocation(start) {
        var startloc = start;
        // var Start = new String(start)
        var l = start.indexOf('[', 0);
        if (start.indexOf("[", 0) >= 0 && start.indexOf("]", 0) >= 0 && start.indexOf(",", 0) >= 0) {
            var vv = start.replace("[", "").replace("]", "").split(',');
            startloc = new window.google.maps.LatLng(vv[0], vv[1]);
        }
        return startloc;
    }
 
 BizMap.prototype.ShowCategory=function (category)
 {
//alert(me);
    for (var i=0; i<this.cmarkers.length; i++) {
          if (this.cmarkers[i].category == category) {
            this.cmarkers[i].setVisible(true);
          }
        }
 };
 BizMap.prototype.HideCategory=function (category)
 {
      this.infowindow.close();
     for (var i=0; i<this.cmarkers.length; i++) {
         if (this.cmarkers[i].category == category) {
          
            this.cmarkers[i].setVisible(false);
          }
        }
 };
 BizMap.prototype.SetCategory=function(box,category)
 {
 
    if (box.checked) {
          this.ShowCategory(category);
        } else {
          this.HideCategory(category);
        }
       
        //this.map.closeInfoWindow();
       

      if (this.sbar!=null)
         {
        
         var bmks=[];
         for (var i=0; i<this.cmarkers.length; i++) {
         
         if (this.cmarkers[i].getVisible() ) {
          
            bmks.push(this.cmarkers[i]);
          }
        }
         if (this.showSidebar){
         
          addtosidebar(this.sbar,bmks,this.moduleid);
          setPage(this.moduleid,this.pgtemplate,this.pagesize,this.listpageid);
          }
         }
    
 };
 BizMap.prototype.createMarkerByPlace=function (np,posn)
    {
          var icon = this.getIcon(this.iconData,np["icon"]);
          var title = np["name"];
          var address=np["address"];
          
          var desc = np["desc"];
          var mk= createMarker(posn, title,desc, icon,this) ;
          mk.category=np["icon"];
          return mk;
    };
 BizMap.prototype.getIcon= function (iconData,image) {
      var icon = null;

      if (image) {
          
        if (this.icons[image]) {
          icon = this.icons[image];
        } else {
            var iconurl = iconData[image][0]; //alert(iconurl);
          if (iconurl!="")
            {
             
             
              var iconsiz;
              var iconp;
              var ssize;
              var size = iconData[image][1];
                if (size.width>0&&size.height>0)
                {
                iconsiz = new window.google.maps.Size(size.width, size.height);
               iconp=new window.google.maps.Point(0, size.height);
                ssize = new window.google.maps.Size(size.width, size.height);
                }else
                {
                   if(this.iconwidth>0&&this.iconheight>0)
                     {
                        iconsiz = new window.google.maps.Size(this.iconwidth, this.iconheight);
                         iconp=new window.google.maps.Point(0, this.iconheight);
                         ssize = new window.google.maps.Size(this.iconwidth, this.iconheight);
                     }
                }
                icon = new window.google.maps.MarkerImage(iconurl,iconsiz,new window.google.maps.Point(0,0),iconp,ssize);
              
                this.icons[image] = icon;
             }
             else
             {
                 return this.getIcon1();
             }
        }
      }else {
      
                 return this.getIcon1();
             }
      return icon;
    };
 BizMap.prototype.getIcon1 = function() {
        var icon;
        if (this.iconimage != "") {
            var iconSize = new window.google.maps.Size(30, 30);
            var iconAnchor = new window.google.maps.Point(0, 30);
            if (this.iconwidth > 0 && this.iconheight > 0) {

                 iconSize = new window.google.maps.Size(this.iconwidth, this.iconheight);
                 iconAnchor = new window.google.maps.Point(0, this.iconheight);
            }
            icon = new window.google.maps.MarkerImage(this.iconimage, iconSize, new window.google.maps.Point(0, 0), iconAnchor, iconSize);

        }

        return icon;
    };

 function myMakerPos(layer,place,bm,markermamager,side,moduleid,pgtemplate,pagesize)
   {
   var mylayer=layer;
   var myplace=place;
   var myMap=bm;
   var mgr=markermamager;
   var sidebar=side;
   var mid=moduleid;
   var pgt=pgtemplate;
   var pgsize=pagesize;

   this.findloc=function(results,status) { //1
            if (status == window.google.maps.GeocoderStatus.OK) { 
                          var nl=mylayer;//nlays[nposn.length-1];
                          var np=myplace;//nplace[nposn.length-1];
                          var point=results[0].geometry.location ;
                          var mk = [];
                               var m = myMap.createMarkerByPlace(np,point); 
                                 m.category=np["icon"];
                                 m.minzoom=nl["zoom"][0];
                                  m.maxzoom=nl["zoom"][1];
                               mk.push(m);
                               myMap.addtoAllmarkers(m);
                               mgr.addMarkers(mk, nl["zoom"][0], nl["zoom"][1]);
                               mgr.refresh();
                               if (sidebar!=null)
                                 {
                                   addtosidebar(sidebar,mk,mid);
                                   setPage(mid,pgt,pgsize,myMap.listpageid);
                                 }
                           
                           }
                      }; //1
         
     }
   
   ///common
   
     function createMarker(posn, title,desc, icon,myMap) {
     
     var markerOptions = {position: posn, title: title,icon:icon  };
     
      var marker = new window.google.maps.Marker(markerOptions);

      window.google.maps.event.addListener(marker, "click", function() { myInfowindow.setContent(desc); myInfowindow.open(myMap.map, marker); myMap.selectedMarker = marker; });  

      return marker;
    }
    
     function addtosidebar(slider,mks,moduleid)
    {
   
       if (slider!=null)
       {
         if(slider.hasChildNodes()) {
            while(slider.childNodes.length >= 1 ) {
               slider.removeChild(slider.firstChild);       
            } 
         }
         
          var ll=mks.length;
          for (var i=0;i<ll;i++)
          {
          
          var mk=mks[i];
             //var label = createElem("sidebar-entry", mk.getTitle(), "a");
             var label = createElem("v" + moduleid+ " hidepiece","<a href='#' class='MarkLable'>" + mk.getTitle() + "</a>"  , "div");
             
             label.href = "#";
             label.style.display = "block";
             label.marker=mk;
             mk.label=label;
             label.onclick = function(){window.google.maps.event.trigger(this.marker,'click'); return false;
             };//x-browser
             label.onfocus = function(){window.google.maps.event.trigger(this.marker,'click'); return false;
             };
             slider.appendChild(label);
            // google.maps.event.addListener(mk,'click',function(){this.label.focus(); return false});
             
           }
          }
    }
    
  function createElem(opt_className, opt_html, opt_tagName) 
  {

    var tag = opt_tagName||"div";
    var elem = document.createElement(tag);
    if (opt_html) elem.innerHTML = opt_html;
    if (opt_className) elem.className = opt_className;
    return elem;
  }

function setPage(moduleid,pgtemplate,pagesize,listpageid){
var whatsnew=new virtualpaginate({
	piececlass: 'v' + moduleid,
    piececontainer:     'div', 
	pieces_per_page: pagesize,
	defaultpage: 0,
	persist: false,
	pagetemplate:pgtemplate
}

);
    var dd = document.getElementById(listpageid);
 if(dd!=null) dd.style.display = "block";
whatsnew.buildpagination([listpageid]);
}
  
  function HideObject(id)
  {
       if(id!=null&&document.getElementById(id)!=null) 
         {
           document.getElementById(id).style.display="none";
          }
  }
