
var MAX_GG = 5; // max google results
var MAX_CRV = 10; // max google results

function do_clear(){
  $('#find_place').val("");
  $('#find_keyword').val("");
  $('#find_camp').val("");
  
  $('#power_check').removeAttr("checked");
  $('#rv_check').removeAttr("checked");
  $('#tent_check').removeAttr("checked");
  $('#winter_check').removeAttr("checked");
  
  $('#crvSearchResults').empty();
  $('#googleSearchResults').hide();
  $('#geocoder-msg').hide();
  
  clearRadiusOverlay();
  
  dataUrl = null;
}

var dataUrl = null;
function requery(){
  // re-query if there is a current search because there was a change
  
  if(dataUrl != null){
  	$('#crvSearchResults').empty();
  	processQuery(0,MAX_CRV);
  }
}


function radiusSearch(point){
  clearRadiusOverlay();
  // point is a GLatLng
  var zoom = map.getZoom();

  // don't focus to get the event
  $('#search-href').click();
          
  $('#crvSearchResults').empty();
  $('#googleSearchResults').hide();
  $('#geocoder-msg').hide();
  
  $('#googleSearchResults').show();

  $('#googleZoomImg').hide();

  //// trying to get the radius to grow as the zoom level shrinks
  //var bounds = map.getBounds();
  //
  //var north_east = LatLong2Albers(bounds.getNorthEast().lng(), bounds.getNorthEast().lat());
  //var south_west = LatLong2Albers(bounds.getSouthWest().lng(), bounds.getSouthWest().lat());
  //
  //var width = Math.abs(Math.max(south_west[0], north_east[0]) - Math.min(south_west[0], north_east[0]))/2;
  //var height = Math.abs(Math.max(north_east[1], south_west[1]) - Math.min(north_east[1], south_west[1]))/2;
  //
  //var radius = Math.min(25,Math.floor(Math.min(width,height)/1000));
  
  var radius = 12.5;
  
  setupRadiusOverlay(point,radius);
  dataUrl = "/camping/search.php?x="+point.lng()+"&y="+point.lat()+"&radius="+radius;
  
  processQuery(0,MAX_CRV);
}

function search(){
  clearRadiusOverlay();
    // don't focus to get the event
  $('#search-href').click();
          
  $('#crvSearchResults').empty();
  $('#googleSearchResults').hide();
  $('#geocoder-msg').hide();
  
  if($('#find_place')[0].value && $('#find_place')[0].value != ""){
    pageTracker._trackPageview("/city/"+$('#find_place')[0].value);
    
    var lbl_place_marker = function(response) {
      // check for errors
      if (response.Status.code==G_GEO_SUCCESS){
        // get a real location msg
        
        if(response.Placemark.length > 1){
            $('#geocoder-msg').clear();
            $('#geocoder-msg').append("You're location was not specific enough; please refine your search");
            $('#geocoder-msg').show();
            return
        }
        if(response.Placemark.length < 1){
            $('#geocoder-msg').clear();
            $('#geocoder-msg').append("You're location was not found; please try another name");
            $('#geocoder-msg').show();
            return
        }
        
        var pm = response.Placemark[0];
      
        // makes a town zoom level 10, addresses zoom level 14
        var zoom = 7 + Math.round(pm.AddressDetails.Accuracy*0.7);

        map.setCenter(new GLatLng(pm.Point.coordinates[1],pm.Point.coordinates[0]),zoom);
    
        $('#googleSearchResults').show();
        $('#googleZoomImg').show();
        $('#googleZoomImg').unbind('click');
        $('#googleZoomImg').bind('click',function(){
          map.setCenter(new GLatLng(pm.Point.coordinates[1],pm.Point.coordinates[0]),zoom);
        });

        dataUrl = "/camping/search.php?x="+pm.Point.coordinates[0]+"&y="+pm.Point.coordinates[1]+"&radius=25";
  
        if($('#find_keyword')[0].value && $('#find_keyword')[0].value != ""){
          dataUrl = dataUrl + "&keywords="+$('#find_keyword')[0].value;
          pageTracker._trackPageview("/keywords/"+$('#find_keyword')[0].value);

        }
        if($('#find_camp')[0].value && $('#find_camp')[0].value != ""){
          dataUrl = dataUrl + "&camp="+$('#find_camp')[0].value;
          pageTracker._trackPageview("/site/"+$('#find_camp')[0].value);
        }
  
        setDataUrl(dataUrl);
        processQuery(0,MAX_CRV);
      }
    };
    
    geocoder.getLocations($('#find_place')[0].value,lbl_place_marker);
  }else{
    if( ($('#find_keyword')[0].value && $('#find_keyword')[0].value != "") || 
        ($('#find_camp')[0].value && $('#find_camp')[0].value != "")){
    
      $('#googleSearchResults').show();
      $('#googleZoomImg').hide();
    
      dataUrl = "";
      if($('#find_keyword')[0].value && $('#find_keyword')[0].value != ""){
        dataUrl = "/camping/search.php?keywords="+$('#find_keyword')[0].value;

        if($('#find_camp')[0].value && $('#find_camp')[0].value != ""){
          dataUrl = dataUrl + "&camp="+$('#find_camp')[0].value;
        }
      }else{
        dataUrl = "/camping/search.php?camp="+$('#find_camp')[0].value;
      }
        
      processQuery(0,MAX_CRV);
    }else{
       alert("At least one City, Campground or Keyword must be specified.");
    }
  }
}

// used for inner functions
function setDataUrl(x){
  dataUrl = x;
}

var searchCounter = 0;

function processQuery(page,limit){
  var url = dataUrl;

  if($('#power_check')[0].checked){
   url = url + "&power=true";
  }
  if($('#rv_check')[0].checked){
   url = url + "&rv=true";
  }
  if($('#tent_check')[0].checked){
   url = url + "&tent=true";
  }
  if($('#winter_check')[0].checked){
   url = url + "&winter=true";
  }
  
  var lyrs = "";
  for (var i=0; i<gvisible.length; i++) {
    if(gvisible[i]){
      if(lyrs != ""){
        lyrs = lyrs+",";
      }
      
      // need the system index
      var aindex = -1;
      for (var j=0; i<layers.length && aindex<0; j++) {
        if(layers[j][2] == gnames[i]) aindex = j;
      }
      
      lyrs = lyrs + layers[aindex][0];
    }
  }
  
  
  url = url+"&layers="+lyrs 
    
  searchCounter = 0;
  $('#crvSearchResults').empty();
  
  var process_it = function(doc) {
     // Parse it
     var jsonData = eval('(' + doc + ')');

     if(page == 0 && (jsonData.results == null || jsonData.results.length == 0)){
       alert("No Search Results Found");
     }
     // Plot the markers
     for (var i=0; i<jsonData.results.length; i++) {
       if(jsonData.results[i]){
       
         var siteId = jsonData.results[i].siteId;
         var name = jsonData.results[i].name;
         var x = jsonData.results[i].x;
         var y = jsonData.results[i].y;
         var layerId = jsonData.results[i].layerId;

         addSearchResult(name,layerId,siteId,x,y);
         
         if(page == 0 && jsonData.results.length == 1){
           map.setCenter(new GLatLng(y,x),12)
         }
       }
     }

     $('#crvPrevPage').hide();
     $('#crvSearchPages').hide();
     $('#crvNextPage').hide();
     
     $('#crvPrevPage').css('cursor','auto');
     $('#crvNextPage').css('cursor','auto');
     
     $('#crvPrevPage').unbind('click');
     $('#crvNextPage').unbind('click');
     
     var paging_used = false;

     if(page>0){
      paging_used = true;
        $('#crvPrevPage').show();
        $('#crvPrevPage').css('cursor','pointer');
     
        $('#crvPrevPage').bind('click',function(){
               processQuery(page-1,limit);
        });
     }

     var totalPages = Math.floor((jsonData.count-1)/limit);

     if(page<totalPages){
      paging_used = true;
        $('#crvNextPage').show();
        $('#crvNextPage').css('cursor','pointer');
     
        $('#crvNextPage').bind('click',function(){
               processQuery(page+1,limit);
        });
     }
     
     if(paging_used){
        $('#crvSearchPages').empty();
        $('#crvSearchPages').append((page+1)+" of "+(totalPages+1));
        $('#crvSearchPages').show();
        
        // display when they have no actions
        $('#crvPrevPage').show();
        $('#crvNextPage').show();
     }

  };

  GDownloadUrl(url+"&page="+page+"&page_limit="+limit, process_it);
}


function addSearchResult(sitename, layerid, siteid, x,y) {
  var layerIndex = -1;

  for(var i=0;layerIndex == -1 && i<layers.length;i++){
    if(layers[i] != null && layers[i][0] == layerid){
      layerIndex = i;
    }
  }

  if(layerIndex > -1){
    var itemLabel = "";
    var index = searchCounter;
    searchCounter = searchCounter+1;

    itemLabel = itemLabel + "<table><tr>";
    itemLabel = itemLabel + "<td><img height=\"16\" width=\"16\" onclick=\"javascipt:showLayerMetadata('"+layers[layerIndex][4]+"')\" src=\""+layers[layerIndex][3]+"\" title=\""+layers[layerIndex][2]+"\"></td>";
    itemLabel = itemLabel + "<td class=\"searchResultsLabel\">"+sitename+"</td>";
    itemLabel = itemLabel + "<td><img height=\"16\" width=\"16\" onClick=\"createKnownWaypoint(new GLatLng("+y+","+x+"),"+layerIndex+","+siteid+")\" title=\"Click to Add Location to Directions\" src=\"http://maps.google.ca/intl/en_ca/mapfiles/icon_green.png\"></td>";
    itemLabel = itemLabel + "<td><img height=\"16\" width=\"16\" onClick=\"map.setCenter(new GLatLng("+y+","+x+"),12)\" title=\"Click to Zoom Map\" src=\"/images/maps/zoom-layer.png\"></td>";
    itemLabel = itemLabel + "</tr></table>";

    $('#crvSearchResults').append("<li id=\"searchResult" + index + "\">" + itemLabel + "</li>") ;

    var li = document.getElementById("searchResult" + index);

    return index;
  }else{
    return -1;
  }
}

var radiusOverlayShape = null;
function clearRadiusOverlay(){
  if(radiusOverlayShape!=null){
    map.removeOverlay(radiusOverlayShape);
    radiusOverlayShape = null;
  }
}

function setupRadiusOverlay(point,radius){
  clearRadiusOverlay();
  // point is a GLatLng
  
  var center = LatLong2Albers(point.lng(), point.lat());
  
  var sw = Albers2LatLong(center[0]-(radius*1000),center[1]-(radius*1000));
  var ne = Albers2LatLong(center[0]+(radius*1000),center[1]+(radius*1000));
  
  radiusOverlayShape = new GPolygon([
    		  new GLatLng(sw.lat(),sw.lng()),
    		  new GLatLng(ne.lat(),sw.lng()),
    		  new GLatLng(ne.lat(),ne.lng()),
    		  new GLatLng(sw.lat(),ne.lng()),
    		  new GLatLng(sw.lat(),sw.lng())], 
    "#f33f00", 5, 1, "#ff0000", 0.2);

  		
  map.addOverlay(radiusOverlayShape);

}


function do_radius(index){
    do_clear();
    var dog = true;
    var point = null;
    
    var mouseMove = GEvent.addListener(map, 'mousemove', function(cursorPoint){
    
        if(dog){
            point = cursorPoint;
        }
        
    }); // end listener
    
    var mapClick = GEvent.addListener(map, 'click', function(){
    
        dog = false;
        // 'mousemove' event listener is deleted to save resources
        GEvent.removeListener(mouseMove);
        
        GEvent.removeListener(mapClick);
        
        radiusSearch(point);
    
    });
}
