var gmarkers = [];
var flags = [];
var gIcons = [];
var ii = 0;
var map;
// === Some cookie parameters ===
var cookiename = "motorcamps_mapinfo";  // name for this cookie
var expiredays = 7;          // number of days before cookie expiry

function filterMarkers()
{   
  var i       = 0;  // loop variable   
  var filter     = 0; // filter   

  // get a collection of objects with the specified 'input' TAGNAME   
  var input_obj = document.getElementsByTagName('input');   
  // loop through all collected objects   
  for (i=0; i < input_obj.length; i++){   
    // if input object is checkbox and checkbox is checked then ...   
    if (input_obj[i].type == 'checkbox' && input_obj[i].checked == true)
    {   
      filter += parseInt(input_obj[i].value);   
    }   
  }   

  setTimeout("renderMarkers(0,"+filter+");",1);
}


function renderMarkers(start, filter) 
{    
	var SEGMENT_SIZE = 200;    
	var index = 0 + start;    
	do {        
		renderMarker(index, filter);        
		index++;    
	   }    
	   while (index < totalMarkers && index < start+SEGMENT_SIZE);    
	if (index<totalMarkers)        
	  setTimeout("renderMarkers("+index+","+filter+");",1);
}

function renderMarker(index, filter)
{
	if((filter & flags[index]) == filter )
       {
		gmarkers[index].show();
       }
	else
	{
		gmarkers[index].hide();
	}
}

function addAllMarkers()
{
  for (i=0; i < totalMarkers; i++)
  {
     map.addOverlay(gmarkers[i]);
  }
}

function moveMap(lat, long) {
map.setCenter(new GLatLng(lat, long));
}


function setZoomLevels()
{
  // set min/max map scale 
  var minmapscale = 5; 
  var maxmapscale = 9; 
  // get array of map types 
  var mapTypes = map.getMapTypes(); 
  // overwrite the getMinimumResolution() and getmaximumResolution() methods for each map type 
  for (var i=0; i<mapTypes.length; i++) { 
    mapTypes[i].getMinimumResolution = function() {return minmapscale;} 
    mapTypes[i].getmaximumResolution = function() {return maxmapscale;} 
  } 
}
            
// If the map position is out of range, move it back
function checkBounds() 
{

  var allowedBounds = new GLatLngBounds(new GLatLng(-47.5,164), new GLatLng(-34.5, 180));

  // Perform the check and return if OK
  if (allowedBounds.contains(map.getCenter())) {
     return;
   }
      
   // It`s not OK, so find the nearest allowed point and move there
        var C = map.getCenter();
        var X = C.lng();
        var Y = C.lat();
 
        var AmaxX = allowedBounds.getNorthEast().lng();
        var AmaxY = allowedBounds.getNorthEast().lat();
        var AminX = allowedBounds.getSouthWest().lng();
        var AminY = allowedBounds.getSouthWest().lat();
 
        if ((X < AminX) && (X > 0)) {X = AminX;}
        if (X < 0) {X = AmaxX;}
        if (Y < AminY) {Y = AminY;}
        if (Y > AmaxY) {Y = AmaxY;}        
        
        //alert ("Restricting "+Y+" "+X);
        map.setCenter(new GLatLng(Y,X));
}


function createMarker(point, name, link, icon1) { 
  var marker = new GMarker(point, {title:name, icon:icon1});    
  GEvent.addListener(marker, "click", function() {
     //map.panTo(point);
     window.location.href=link;});  
  return marker;
}

function readMap(url) {
	
	var count = 0;
  $.ajax({
      type: "GET",
      url: url,
      dataType: "xml",
      success: function(xml) {
      $(xml).find('mk').each(function(){
        var lat = parseFloat($(this).attr('t'));
        var lng = parseFloat($(this).attr('g'));
        var title = $(this).attr('l');
        var rating = parseInt($(this).attr('r'));
        var nodeflags = parseInt($(this).attr('f'));
        var nodeid = $(this).attr('n');
        var point = new GLatLng(lat, lng);
	 var marker = createMarker(point, title, "/node/" + nodeid, gIcons[rating] );
	
	 gmarkers[count] = marker;
        flags[count] = nodeflags;        
        count++;
         
       }); //close each(
       totalMarkers = count;
	addAllMarkers();
	document.getElementById("loading_markers").style.display = "none";
      },
	error: function( objRequest ){
		readMap(url); 
	}
      }); //close $.ajax(

}

      function setCookie() 
      {
        maptype = 0;
        for (var i=0;i<map.getMapTypes().length;i++) {
          if (map.getCurrentMapType() == map.getMapTypes()[i]) {
            maptype = i;
          }
        }
        var cookietext = cookiename+"="+map.getCenter().lat()+"|"+map.getCenter().lng()+"|"+map.getZoom()+"|"+maptype;
        if (expiredays) {
          var exdate=new Date();
          exdate.setDate(exdate.getDate()+expiredays);
          cookietext += ";expires="+exdate.toGMTString();
        }
        // == write the cookie ==
        document.cookie=cookietext;
        // == Call GUnload() on exit ==
        GUnload();
      }

function initialize() {
    $(window).unload(setCookie);     
    map = new google.maps.Map2(document.getElementById("map"));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.addControl( new GOverviewMapControl(new GSize(140,160)) );

    setZoomLevels();

      // === Default values to use if there is no cookie ===
      var lat = -36.57142382346275;
      var lng = 175.49560546875;
      var zoom = 7;
      var maptype = 0;
 
      // === Look for the cookie ===
      if (document.cookie.length>0) {
        cookieStart = document.cookie.indexOf(cookiename + "=");
        if (cookieStart!=-1) {
          cookieStart += cookiename.length+1; 
          cookieEnd=document.cookie.indexOf(";",cookieStart);
          if (cookieEnd==-1) {
            cookieEnd=document.cookie.length;
          }
          cookietext = document.cookie.substring(cookieStart,cookieEnd);
          // == split the cookie text and create the variables ==
          bits = cookietext.split("|");
          lat = parseFloat(bits[0]);
          lng = parseFloat(bits[1]);
          zoom = parseInt(bits[2]);
          maptype = parseInt(bits[3]);
        } 
      }

    map.setCenter(new GLatLng(lat,lng),zoom,map.getMapTypes()[maptype]);

// Add a move listener to restrict the bounds range
      GEvent.addListener(map, "move", function() {
        checkBounds();
      });

    var iconCount = 0;

    while(iconCount < 6)
    {
      var icon = new GIcon(); 
      icon.image = "/modules/gmap/markers/custom/teardrop" + iconCount + ".png"; 
      icon.shadow = "/modules/gmap/markers/custom/shadow2.png"; 
      icon.iconSize = new GSize(20, 34); 
      icon.shadowSize = new GSize(37,34);    
      icon.iconAnchor = new GPoint(10, 29);

      gIcons[iconCount] = icon;
      iconCount++;
    }

//  var randomnumber=Math.floor(Math.random()*100000);
    document.getElementById("loading_markers").style.display = "block";
    readMap("/mapdata.php"); //?r=" + randomnumber);
}

  google.load("maps", "2.x");
  $(document).ready(function() {
      initialize();
   }); 