/* data loading */

// data set wiring
var gnames = [];
var gvisible = [];
var gurl = [];
var gcampground = [];

// marker sets / wiring
var gmarkers = [];
var glabel = [];
var gIcon = [];
var gmarkerevents = [];
var gids = [];

// creates a local geocoder cache

function CampingCache() {
   GGeocodeCache.apply(this);
}  
// Assigns an instance of the parent class as a prototype of the  
// child class, to make sure that all methods defined on the parent  
// class can be directly invoked on the child class.  

CampingCache.prototype = new GGeocodeCache();  
// Override the reset method to populate the empty cache with  
// information from our array of geocode responses for capitals.  

CampingCache.prototype.reset = function() {    
  GGeocodeCache.prototype.reset.call(this);    
  for (var i in gmarkers) {  
    for (var j in gmarkers[i]) {
      if(gmarkers[i][j]){
      
      var lat = gmarkers[i][j].getLatLng().lat();
      var lng = gmarkers[i][j].getLatLng().lng();
      var nm = gmarkers[i][j].getTitle();
      var x = {
        name: nm,
        Status: {
          code: 200,
          request: "geocode"
        },
        Placemark: [
          {
            address: "2328 governement st",
            population: "1",
            Point: {
              coordinates: [lng, lat, 0]
            },
            AddressDetails: {
              Country: {
                CountryNameCode: "CAN",
                AdministrativeArea: {
                AdministrativeAreaName: "BC",
                  Locality: {LocalityName: ""}
                }
              }
            }
          }
        ]
      };
      
        
        this.put(gnames[i][j], x);    
      }
    }
  }
}


// sets up the data from the json calls

function addCampground(name,dataUrl,metadataUrl,image,visible){

  var aindex = gnames.length;
  
  gnames[aindex] = name;
  gvisible[aindex] = visible;
  gurl[aindex] = dataUrl;
  gcampground[aindex] = true;
  gmarkers[aindex] = [];
  glabel[aindex] = [];
  gmarkerevents[aindex] = [];
  gids[aindex] = [];
  
  gIcon[aindex] = new GIcon();
  if(image){
    gIcon[aindex].image = image;
  }else{
    gIcon[aindex].image = "http://econym.org.uk/gmap/marker.png";
  }
  gIcon[aindex].shadow = "";
  gIcon[aindex].iconSize = new GSize(20, 20);
  gIcon[aindex].shadowSize = null;
  gIcon[aindex].iconAnchor = new GPoint(10, 10);
  gIcon[aindex].infoWindowAnchor = new GPoint(10, 10);
  gIcon[aindex].infoShadowAnchor = null;
  
  var process_it = function(doc) {
     // Parse it
     var jsonData = eval('(' + doc + ')');

     // Plot the markers
     for (var i=0; i<jsonData.markers.length; i++) {
       if(jsonData.markers[i]){
         var id = jsonData.markers[i].id;
         var label = jsonData.markers[i].label;
       
         // keep references around
         glabel[aindex][glabel[aindex].length] = label;
       
         var marker = createMarker(id, jsonData.markers[i].point, aindex);
         var title = "<a href='javascript:show(\""+name+"\",\""+id+"\")'>"+label+"</a>";
         
    	 if(visible)
         	campsites.AddMarker(marker,title);
       }
     }

     setupCampgroundDropList();

   }

   GDownloadUrl(dataUrl, process_it);
   
   setupLegend(aindex, name, image, metadataUrl,visible);
  
   Clusterer.Display(campsites);
}

function addFishing(name,dataUrl,metadataUrl,image,visible){

  var aindex = gnames.length;
  
  gnames[aindex] = name;
  gvisible[aindex] = visible;
  gurl[aindex] = dataUrl;
  gcampground[aindex] = true;
  gmarkers[aindex] = [];
  glabel[aindex] = [];
  gmarkerevents[aindex] = [];
  gids[aindex] = [];
  
  gIcon[aindex] = new GIcon();
  if(image){
    gIcon[aindex].image = image;
  }else{
    gIcon[aindex].image = "http://econym.org.uk/gmap/marker.png";
  }
  gIcon[aindex].shadow = "";
  gIcon[aindex].iconSize = new GSize(20, 20);
  gIcon[aindex].shadowSize = null;
  gIcon[aindex].iconAnchor = new GPoint(10, 10);
  gIcon[aindex].infoWindowAnchor = new GPoint(10, 10);
  gIcon[aindex].infoShadowAnchor = null;
  
  var process_it = function(doc) {
     // Parse it
     var jsonData = eval('(' + doc + ')');

     // Plot the markers
     for (var i=0; i<jsonData.markers.length; i++) {
       if(jsonData.markers[i]){
         var id = jsonData.markers[i].id;
         var label = jsonData.markers[i].label;
       
         // keep references around
         glabel[aindex][glabel[aindex].length] = label;
       
         var marker = createMarker(id, jsonData.markers[i].point, aindex);
         var title = "<a href='javascript:show(\""+name+"\",\""+id+"\")'>"+label+"</a>";
  
  	 if(visible)
  	       campsites.AddMarker(marker,title);
       }
     }
     
     // do not include in drop list
   }

   GDownloadUrl(dataUrl, process_it);
   
   setupLegend(aindex, name, image, metadataUrl,visible);
  
   //Clusterer.Display(campsites);
}

function addRentals(name,dataUrl,metadataUrl,image,visible){

  var aindex = gnames.length;
  
  gnames[aindex] = name;
  gvisible[aindex] = visible;
  gurl[aindex] = dataUrl;
  gcampground[aindex] = false;
  gmarkers[aindex] = [];
  glabel[aindex] = [];
  gmarkerevents[aindex] = [];
  gids[aindex] = [];
  
  gIcon[aindex] = new GIcon();
  if(image){
    gIcon[aindex].image = image;
  }else{
    gIcon[aindex].image = "http://econym.org.uk/gmap/marker.png";
  }
  gIcon[aindex].shadow = "";
  gIcon[aindex].iconSize = new GSize(20, 20);
  gIcon[aindex].shadowSize = null;
  gIcon[aindex].iconAnchor = new GPoint(10, 10);
  gIcon[aindex].infoWindowAnchor = new GPoint(10, 10);
  gIcon[aindex].infoShadowAnchor = null;
  
  var process_it = function(doc) {
     // Parse it
     var jsonData = eval('(' + doc + ')');

     // Plot the markers
     for (var i=0; i<jsonData.markers.length; i++) {
       if(jsonData.markers[i]){
         var id = jsonData.markers[i].id;
         var label = jsonData.markers[i].label;
       
         // keep references around
         glabel[aindex][glabel[aindex].length] = label;
       
         var marker = createMarker(id, jsonData.markers[i].point, aindex);
         var title = "<a href='javascript:show(\""+name+"\",\""+id+"\")'>"+label+"</a>";
  
    	 if(visible)
  	       rentals.AddMarker(marker,title);
       }
     }

     setupCampgroundDropList();

   }

   GDownloadUrl(dataUrl, process_it);
  
   setupLegend(aindex, name, image, metadataUrl,visible);
  
   Clusterer.Display(rentals);
}

function setupLegend(aindex, name, image, metadataUrl,visible){  

  var x = "";

  if(visible == true){
    x = " checked=\"checked\"";
  }
  
  $(function() {
      var line = "";
      
      if(aindex % 3 == 0){
        $("#layers").append("<tr></tr>");
      }
      
      
      // should be onchange except this doesn't work in ie ... so it's onclick which is almost the same
      line = line + "<td><input type=\"checkbox\" id=\""+name+"\""+x+" title=\"Click to Add / Remove "+name+"\" onclick=\"toggle('"+name+"')\"/>";
      line = line + "<img width=\"16px\" height=\"16px\" onclick=\"javascipt:showLayerMetadata('"+metadataUrl+"')\" src=\""+image+"\" title=\""+name+"\"/>";
      line = line + "<label for=\""+name+"\">"+name+"</label></td>";
      
      //var n = $('tr:last td',$("#layers"));
      
      $(line).appendTo( $('tr:last',$("#layers")) ) ;
  });
}

function setupCampgroundDropList(){
  
  var campground_names = [];
  
  for (var i=0; i<glabel.length; i++) {
  	// exclude fishing sites
    if(glabel[i]!=null && FISHING != layers[i][1]){
      for(var j=0; j<glabel[i].length; j++){
        if(glabel[i][j] != null){
          campground_names[campground_names.length] = glabel[i][j];
        }
      }
    }
  }
  
  $("#find_camp").autocomplete(campground_names.sort(),{matchContains:true, scrollHeight:240, max:50});
  
}

function showLayerMetadata(url){
  if(!(url==null || url == "")){
    window.open(url);
  }
}

// keep this a seperate function for memory stack issues
function createMarker(id, point, aindex) {
  return createMarker2(id,point,aindex,gmarkers[aindex].length) ;
}

function createMarker2(id, point, aindex, index) {

  

  var marker = new GMarker(point,{
    icon:gIcon[aindex],title:glabel[aindex][index]
  });
  
  // keep references around
  gmarkers[aindex][index] = null;
  gmarkers[aindex][index] = marker;
  gids[aindex][index] = id;
  
  // clean up
  if(gmarkerevents[aindex][index]!=null){
    if(gmarkerevents[aindex][index][0]){
      GEvent.removeListener(gmarkerevents[aindex][index][0]);
    }
    if(gmarkerevents[aindex][index][1]){
      GEvent.removeListener(gmarkerevents[aindex][index][1]);
    }
  }
  gmarkerevents[aindex][index] = [];
        
  gmarkerevents[aindex][index][0] = GEvent.addListener(marker, "click", function() {
    showDetails(marker,aindex,id);
  });
        
  gmarkerevents[aindex][index][1] = GEvent.addListener(marker, "singlerightclick", function() {
    contextMenu.showDataMarkerMenu(aindex,index,id);
  });
  
  return marker;
}

/* connect to service for attr data */
function showDetails(marker, aindex, id){

    var url = location.href;
    url = url.substring(0,url.lastIndexOf("/"));
    url = url + "/balloons.php?id="+id;

    var process_it = function(doc) {
      if(doc){
        // Parse it
        var jsonData = eval('(' + doc + ')');
   
        // make html
        var html = "";
        
        if(FISHING == layers[aindex][1]){
        
	        html = html + "<table border=\"0px\" class=\"fish_map_bubble\">";
	        
		html = html + "<tr><td colspan=\"2\" style=\"text-align: center;\"><u><b>"+jsonData.name+"</b></u><br></td></tr>";
	        
		// fishing places hidden data here
	        html = html + "<tr><td style=\"text-align: left;\"><b>Closest City</b>:</td><td style=\"text-align: left;\">"+jsonData.city+"</td></tr>";
	          
	        
		if(jsonData.www){
		   html = html + "<tr><td style=\"text-align: left;\"><b>Waterbody Reports</b>:</td><td style=\"text-align: left;\">";
		   html = html + "<a href=\""+jsonData.www+"\" onclick=\"javascript:pageTracker._trackPageview('/external/"+jsonData.www+"')\" target=\"_blank\">BC Fisheries Inventory</a></td></tr>";
		}
	        
	        html = html + "<tr><td colspan=\"2\" align=\"left\"><br><b>Online Fishing Resources</b></td></tr>"
	        html = html + "<tr><td colspan=\"2\" align=\"left\"><a href=\"http://www.fishing.gov.bc.ca\" target=\"_blank\">Freshwater Angling Licences & Regulations</a></td></tr>"
	        html = html + "<tr><td align=\"left\">Provincial Fishing:</td><td style=\"text-align: left;\"><a href=\"http://www.discoverfishingbc.ca\" target=\"_blank\">discoverfishingbc.ca</a></td></tr>"
	        html = html + "<tr><td align=\"left\">Freshwater Fishing:</td><td style=\"text-align: left;\"><a href=\"http://www.gofishbc.com\" target=\"_blank\">gofishbc.com</a></td></tr>"
	        
        	html = html + "</table>";
        }else{
        
	        html = html + "<table border=\"0px\" class=\"map_bubble\">";
	        if(jsonData.www){
	          html = html + "<tr><td colspan=\"2\" style=\"text-align: center;\">";
	          html = html + "<a href=\""+jsonData.www+"\" onclick=\"javascript:pageTracker._trackPageview('/external/"+jsonData.www+"')\" target=\"_blank\">"+jsonData.name+"</a></td></tr>";
	        }else{
	          html = html + "<tr><td colspan=\"2\" style=\"text-align: center;\">"+jsonData.name+"</td></tr>";
	        }
	        
	        if(jsonData.description && !gcampground[aindex])
	          html = html + "<tr><td colspan=\"2\">"+jsonData.description.substr(0,2000)+"</td></tr>";
	          
	        // fishing places hidden data here
	        if(jsonData.rates)
	          html = html + "<tr><td colspan=\"2\" style=\"text-align: center;\">Rates: "+jsonData.rates+"</td></tr>";
	          
	        if(!gcampground[aindex]){
	          html = html + "<tr><td colspan=\"2\" style=\"font-size: 9px; text-align: center;\">";
	          
	  	  if(jsonData.addr || jsonData.city){
		    html = html + jsonData.addr+ " " + jsonData.city
		    if(jsonData.prov || jsonData.postal){
		      html = html +", "+jsonData.prov+" "+jsonData.postal;
		    }
		    html = html +"<br/>";
		  }
	
		  if(jsonData.phone)
		    html = html + "Phone: "+jsonData.phone+" " 
		  if(jsonData.fax)
		    html = html + "Fax:   "+jsonData.fax+" " 
		  if(jsonData.toll)
		    html = html + "Toll Free: "+jsonData.toll;
	          html = html + "</td></tr>";
	        }
	               
	        html = html + "<tr><td colspan=\""+(jsonData.email?"1":"2")+"\"style=\"text-align: "+(jsonData.email?"left":"center")+"; padding: 8px 0 0 0;\">"
	        if((jsonData.power && jsonData.power.toUpperCase() == "TRUE")){
	            html = html + "<img alt=\"Power Available\" width=\"26px\" height=\"26px\" title=\"Power Available\" src=\"/images/maps/electricaloutlets.gif\"/> "
	        }else{
	            if((jsonData.power && jsonData.power.toUpperCase() == "FALSE")){
	                html = html + "<img alt=\"Power Not Available\" width=\"26px\" height=\"26px\" title=\"Power Not Available\" src=\"/images/maps/electricaloutlets_gr.gif\"/> "
	            }
	        }
	        
	        if((jsonData.rv && jsonData.rv.toUpperCase() == "TRUE")){
	            html = html + "<img alt=\"RV Sites Available\" width=\"26px\" height=\"26px\" title=\"RV Sites Available\" src=\"/images/maps/rv.gif\"/> "
	        }else{
	            if((jsonData.rv && jsonData.rv.toUpperCase() == "FALSE")){
	                html = html + "<img alt=\"RV Sites Not Available\" width=\"26px\" height=\"26px\" title=\"RV Sites Not Available\" src=\"/images/maps/rv_gr.gif\"/> "
	            }
	        }
	        if((jsonData.tenting && jsonData.tenting.toUpperCase() == "TRUE")){
	            html = html + "<img alt=\"Tent Sites Available\" width=\"26px\" height=\"26px\" title=\"Tent Sites Available\" src=\"/images/maps/tenting.gif\"/> "
	        }else{
	            if((jsonData.tenting && jsonData.tenting.toUpperCase() == "FALSE")){
	                html = html + "<img alt=\"Tent Sites Not Available\" width=\"26px\" height=\"26px\" title=\"Tent Sites Not Available\" src=\"/images/maps/tenting_gr.gif\"/> "
	            }
	        }
	        if((jsonData.winter && jsonData.winter.toUpperCase() == "TRUE")){
	            html = html + "<img alt=\"Winter Camping Available\" width=\"26px\" height=\"26px\" title=\"Winter Camping Available\" src=\"/images/maps/wintercamping.gif\"/> "
	        }else{
	            if((jsonData.winter && jsonData.winter.toUpperCase() == "FALSE")){
	                html = html + "<img alt=\"Winter Camping Not Available\" width=\"26px\" height=\"26px\" title=\"Winter Camping Not Available\" src=\"/images/maps/wintercamping_gr.gif\"/> "
	            }
	        }
	
	        //Seasonal Campsite Rentals   ---   jsonData.seasonal
	       
	        html = html + "</td>"
	
	        if(jsonData.email){
	          html = html + "<td style=\"text-align: right;\"><a href=\"mailto:"+jsonData.email+"\" onclick=\"javascript:pageTracker._trackPageview('/external/"+jsonData.email+"')\" target=\"_blank\">Email</a></td>";
	        }
	        html = html+ "</tr>";
	       
	        html = html + "<tr><td colspan=\"2\" align=\"center\"><a href=\"javascript:metadata('siteInfo.php?id="+id+"')\">More Details</a></td></tr>"
        	html = html + "</table>";
        }
       
        marker.openInfoWindowHtml(html);
      }else{
        map.closeInfoWindow();
      }
    }
  
  GDownloadUrl(url, process_it);
}

function metadata(url){
	window.open(url,'_blank','width=640,height=420,menubar=no,titlebar=no,toolbar=no,scrollbars=yes',false);
}

function toggle(data){
  if(data == null)return;
  // find index
  var aindex = -1;
  for (var i=0; i<gnames.length && aindex<0; i++) {
    if(data == gnames[i]) aindex = i;
  }
  
  if(aindex == -1)return;

  var elem = document.getElementById(data);
  var visible = elem.checked;
  
  // keep it up-to-date
  gvisible[aindex] = visible;
  
  // clear the search results
  requery();
  
  
  for (var i=0; i<gmarkers[aindex].length; i++) {
    if(gmarkers[aindex][i]){
      if(visible){
      
       var oldm = gmarkers[aindex][i];
       
       var marker = createMarker2(gids[aindex][i], oldm.getLatLng(), aindex,i);
       
       var title = "<a href='javascript:show(\""+gnames[aindex]+"\",\""+gids[aindex][i]+"\")'>"+glabel[aindex][i]+"</a>";
       
       if(gcampground[aindex]){
         campsites.AddMarker(marker,title);
       }else{
         rentals.AddMarker(marker,title);
       }
      }else{
        if(gcampground[aindex]){
          campsites.RemoveMarker(gmarkers[aindex][i]);
        }else{
          rentals.RemoveMarker(gmarkers[aindex][i]);
        }
        
        if(gmarkerevents[aindex][i]!=null){
          if(gmarkerevents[aindex][i][0]){
            GEvent.removeListener(gmarkerevents[aindex][i][0]);
          }
          if(gmarkerevents[aindex][i][1]){
            GEvent.removeListener(gmarkerevents[aindex][i][1]);
          }
        }
        gmarkerevents[aindex][i] = null;
      } // visible
    }
  } // for
  
  if(gcampground[aindex]){
    Clusterer.Display(campsites);
  }else{
    Clusterer.Display(rentals);
  }
}

function show(name,id){
  
  if(name == null)return;
  if(id == null)return;
  
  // find index
  var aindex = -1;
  for (var i=0; i<gnames.length && aindex<0; i++) {
    if(name == gnames[i]) aindex = i;
  }
  
  if(aindex == -1)return;
  
  var iindex = -1;
  for (var i=0; i<gids[aindex].length && iindex<0; i++) {
    if(id == gids[aindex][i]) iindex = i;
  }
  
  if(iindex == -1)return;
  
  var marker = gmarkers[aindex][iindex];
  if(marker == null)return;
  
  var zoom = 11;
  if(map.getZoom() >= zoom){
    // removed to fix a hide/show bug between clusterer and marker bubbles
    //map.panTo(marker.getLatLng());
  }else{
    map.setCenter(marker.getLatLng(),zoom);
  }
  
  showDetails(marker,aindex,gids[aindex][iindex]);
  
}

// called from cluster by way of a custom piece
function cZoom(cluster){
  var cur_zoom = map.getZoom();
  cur_zoom = Math.min(cur_zoom,18);
  var delta_zoom = Math.floor((18-cur_zoom)/ZOOM_FACTOR);
  delta_zoom = Math.max(delta_zoom,1);
  
  if(cluster.poppedUpCluster){
    map.setCenter(cluster.poppedUpCluster.marker.getLatLng(),cur_zoom+delta_zoom);
  }else{
    map.setZoom(cur_zoom+delta_zoom);
  }
  
}
